﻿    /**
    * Flash (http://jquery.lukelutman.com/plugins/flash)
    * A jQuery plugin for embedding Flash movies.
    * 
    * Version 1.0
    * November 9th, 2006
    *
    * Copyright (c) 2006 Luke Lutman (http://www.lukelutman.com)
    * Dual licensed under the MIT and GPL licenses.
    * http://www.opensource.org/licenses/mit-license.php
    * http://www.opensource.org/licenses/gpl-license.php
    * 
    * Inspired by:
    * SWFObject (http://blog.deconcept.com/swfobject/)
    * UFO (http://www.bobbyvandersluis.com/ufo/)
    * sIFR (http://www.mikeindustries.com/sifr/)
    * 
    * IMPORTANT: 
    * The packed version of jQuery breaks ActiveX control
    * activation in Internet Explorer. Use JSMin to minifiy
    * jQuery (see: http://jquery.lukelutman.com/plugins/flash#activex).
    *
    **/
    ; (function () {

        var $$;

        /**
         * 
         * @desc Replace matching elements with a flash movie.
         * @author Luke Lutman
         * @version 1.0.1
         *
         * @name flash
         * @param Hash htmlOptions Options for the embed/object tag.
         * @param Hash pluginOptions Options for detecting/updating the Flash plugin (optional).
         * @param Function replace Custom block called for each matched element if flash is installed (optional).
         * @param Function update Custom block called for each matched if flash isn't installed (optional).
         * @type jQuery
         *
         * @cat plugins/flash
         * 
         * @example $('#hello').flash({ src: 'hello.swf' });
         * @desc Embed a Flash movie.
         *
         * @example $('#hello').flash({ src: 'hello.swf' }, { version: 8 });
         * @desc Embed a Flash 8 movie.
         *
         * @example $('#hello').flash({ src: 'hello.swf' }, { expressInstall: true });
         * @desc Embed a Flash movie using Express Install if flash isn't installed.
         *
         * @example $('#hello').flash({ src: 'hello.swf' }, { update: false });
         * @desc Embed a Flash movie, don't show an update message if Flash isn't installed.
         *
        **/
        $$ = jQuery.fn.flash = function (htmlOptions, pluginOptions, replace, update) {

            // Set the default block.
            var block = replace || $$.replace;

            // Merge the default and passed plugin options.
            pluginOptions = $$.copy($$.pluginOptions, pluginOptions);

            // Detect Flash.
            if (!$$.hasFlash(pluginOptions.version)) {
                // Use Express Install (if specified and Flash plugin 6,0,65 or higher is installed).
                if (pluginOptions.expressInstall && $$.hasFlash(6, 0, 65)) {
                    // Add the necessary flashvars (merged later).
                    var expressInstallOptions = {
                        flashvars: {
                            MMredirectURL: location,
                            MMplayerType: 'PlugIn',
                            MMdoctitle: jQuery('title').text()
                        }
                    };
                    // Ask the user to update (if specified).
                } else if (pluginOptions.update) {
                    // Change the block to insert the update message instead of the flash movie.
                    block = update || $$.update;
                    // Fail
                } else {
                    // The required version of flash isn't installed.
                    // Express Install is turned off, or flash 6,0,65 isn't installed.
                    // Update is turned off.
                    // Return without doing anything.
                    return this;
                }
            }

            // Merge the default, express install and passed html options.
            htmlOptions = $$.copy($$.htmlOptions, expressInstallOptions, htmlOptions);

            // Invoke $block (with a copy of the merged html options) for each element.
            return this.each(function () {
                block.call(this, $$.copy(htmlOptions));
            });

        };
        /**
         *
         * @name flash.copy
         * @desc Copy an arbitrary number of objects into a new object.
         * @type Object
         * 
         * @example $$.copy({ foo: 1 }, { bar: 2 });
         * @result { foo: 1, bar: 2 };
         *
        **/
        $$.copy = function () {
            var options = {}, flashvars = {};
            for (var i = 0; i < arguments.length; i++) {
                var arg = arguments[i];
                if (arg == undefined) continue;
                jQuery.extend(options, arg);
                // don't clobber one flash vars object with another
                // merge them instead
                if (arg.flashvars == undefined) continue;
                jQuery.extend(flashvars, arg.flashvars);
            }
            options.flashvars = flashvars;
            return options;
        };
        /*
         * @name flash.hasFlash
         * @desc Check if a specific version of the Flash plugin is installed
         * @type Boolean
         *
        **/
        $$.hasFlash = function () {
            // look for a flag in the query string to bypass flash detection
            if (/hasFlash\=true/.test(location)) return true;
            if (/hasFlash\=false/.test(location)) return false;
            var pv = $$.hasFlash.playerVersion().match(/\d+/g);
            var rv = String([arguments[0], arguments[1], arguments[2]]).match(/\d+/g) || String($$.pluginOptions.version).match(/\d+/g);
            for (var i = 0; i < 3; i++) {
                pv[i] = parseInt(pv[i] || 0);
                rv[i] = parseInt(rv[i] || 0);
                // player is less than required
                if (pv[i] < rv[i]) return false;
                // player is greater than required
                if (pv[i] > rv[i]) return true;
            }
            // major version, minor version and revision match exactly
            return true;
        };
        /**
         *
         * @name flash.hasFlash.playerVersion
         * @desc Get the version of the installed Flash plugin.
         * @type String
         *
        **/
        $$.hasFlash.playerVersion = function () {
            // ie
            try {
                try {
                    // avoid fp6 minor version lookup issues
                    // see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
                    var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
                    try { axo.AllowScriptAccess = 'always'; }
                    catch (e) { return '6,0,0'; }
                } catch (e) { }
                return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
                // other browsers
            } catch (e) {
                try {
                    if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
                        return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
                    }
                } catch (e) { }
            }
            return '0,0,0';
        };
        /**
         *
         * @name flash.htmlOptions
         * @desc The default set of options for the object or embed tag.
         *
        **/
        $$.htmlOptions = {
            height: 240,
            flashvars: {},
            pluginspage: 'http://www.adobe.com/go/getflashplayer',
            src: '#',
            type: 'application/x-shockwave-flash',
            width: 320
        };
        /**
         *
         * @name flash.pluginOptions
         * @desc The default set of options for checking/updating the flash Plugin.
         *
        **/
        $$.pluginOptions = {
            expressInstall: false,
            update: true,
            version: '6.0.65'
        };
        /**
         *
         * @name flash.replace
         * @desc The default method for replacing an element with a Flash movie.
         *
        **/
        $$.replace = function (htmlOptions) {
            this.innerHTML = '<div class="alt">' + this.innerHTML + '</div>';
            jQuery(this)
                .addClass('flash-replaced')
                .prepend($$.transform(htmlOptions));
        };
        /**
         *
         * @name flash.update
         * @desc The default method for replacing an element with an update message.
         *
        **/
        $$.update = function (htmlOptions) {
            var url = String(location).split('?');
            url.splice(1, 0, '?hasFlash=true&');
            url = url.join('');
            var msg = '<p>This content requires the Flash Player. <a href="http://www.adobe.com/go/getflashplayer">Download Flash Player</a>. Already have Flash Player? <a href="' + url + '">Click here.</a></p>';
            this.innerHTML = '<span class="alt">' + this.innerHTML + '</span>';
            jQuery(this)
                .addClass('flash-update')
                .prepend(msg);
        };
        /**
         *
         * @desc Convert a hash of html options to a string of attributes, using Function.apply(). 
         * @example toAttributeString.apply(htmlOptions)
         * @result foo="bar" foo="bar"
         *
        **/
        function toAttributeString() {
            var s = '';
            for (var key in this)
                if (typeof this[key] != 'function')
                    s += key + '="' + this[key] + '" ';
            return s;
        };
        /**
         *
         * @desc Convert a hash of flashvars to a url-encoded string, using Function.apply(). 
         * @example toFlashvarsString.apply(flashvarsObject)
         * @result foo=bar&foo=bar
         *
        **/
        function toFlashvarsString() {
            var s = '';
            for (var key in this)
                if (typeof this[key] != 'function')
                    s += key + '=' + encodeURIComponent(this[key]) + '&';
            return s.replace(/&$/, '');
        };
        /**
         *
         * @name flash.transform
         * @desc Transform a set of html options into an embed tag.
         * @type String 
         *
         * @example $$.transform(htmlOptions)
         * @result <embed src="foo.swf" ... />
         *
         * Note: The embed tag is NOT standards-compliant, but it 
         * works in all current browsers. flash.transform can be
         * overwritten with a custom function to generate more 
         * standards-compliant markup.
         *
        **/
        $$.transform = function (htmlOptions) {
            htmlOptions.toString = toAttributeString;
            if (htmlOptions.flashvars) htmlOptions.flashvars.toString = toFlashvarsString;
            return '<embed ' + String(htmlOptions) + '/>';
        };

        /**
         *
         * Flash Player 9 Fix (http://blog.deconcept.com/2006/07/28/swfobject-143-released/)
         *
        **/
        if (window.attachEvent) {
            window.attachEvent("onbeforeunload", function () {
                __flash_unloadHandler = function () { };
                __flash_savedUnloadHandler = function () { };
            });
        }

    })();
